iT邦幫忙

2021 iThome 鐵人賽

DAY 27
1

今天,我們就來看一個指標的範例,測試一下對於指標的概念,是不是真的熟悉~

看一下下面的程式碼:

#include<stdio.h>
int main(){
	int data[] = {10, 21, 35, 47, 51};
	int *p[] = {data, data+1, data+2, data+3, data+4};
	int **p_p = p;
	printf("*p[1] = %d\n\n", *p[1]);
	printf("**p_p = %d\n\n", **p_p);
	printf("*(*p_p+1) = %d\n\n", *(*p_p+1));
	printf("*(*(p_p+1)+2) = %d\n\n", *(*(p_p+1)+2));
	return 0;
	
} 

不知道大家會不會跟我一樣,看到兩顆星星 ** 就開始害怕,想說這到底是甚麼東西?
但請仔細思考、並複習一下前三天講的,就會發現沒有那麼難的!

有答案了嗎?讓我們先看看輸出結果!

我們把圖畫出來,再解釋:

為了方便說明,以下粗體字代表的是位址,且我們用上面那張圖結合程式來說明:

  • 我們先宣告一個陣列 data[],並在裡面放五筆資料。再宣告指標陣列 p[],這個指標陣列裡面的資料放的是 data[] 五筆資料的位址。
  • 另外再宣告一個指向指標的指標 p_p ,裡面放的是指標 p 的位址(p)。
  • 先輸出 *p[1]p[1]裡面放的位址是 data+1 ,我們對 data+1 取值,所以輸出 21。
  • 輸出 **p_p ,也就是在 p 位址放的位址(data)的值,所以輸出 10。
  • 再輸出 *(*p_p+1) ,因為*p_pp 位址放的位址(data),然後 data+1 取值,所以印出 21。
  • 最後輸出 *(*(p_p+1)+2)*(p_p+1)等於 p+1 位址放的位址(data+1),然後我們把他加 2 後再取值,所以輸出是 47。

不知道大家的腦袋有沒有覺得繞來繞去的感覺~如果以上內容都非常清楚的話,那恭喜你!基本的指標概念應該已經都學起來了!但是,指標的內容蠻容易忘記的,所以記得要常常複習喔~

明天,讓我們來講講新的東西 - 函式!


上一篇
【Day 26】指標介紹(下)
下一篇
【Day 28】函式(上)
系列文
C 語言的簡單入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
juck30808
iT邦研究生 1 級 ‧ 2021-10-12 18:39:51

恭喜大大即將完賽XD !!!

我要留言

立即登入留言